/**
 * uni-app上拉加载和下拉刷新混合(支持搜索功能)
 * @description 为了混合命名冲突的问题该混合变量和方法均以'mxList'开头
 * @author maybe
 */

const loadMoreConf = {
	loadingText: '努力加载中',
	loadMoreText: '上拉加载',
	noMoreText: '没有更多了'
}


export default {
	data() {
		return {
			/**
			 * 混合配置（list-minxin）
			 */
			mxListConf: {
				mode: 'show', // 'load'在onLoad加载, 'show'在onShow加载
				loading: false, // 是否加载数据
				finished: false, // 是否加载完成
				list: [], // 数据列表
				page: 0, // 由于分页一般页面要+1，所以为了方便分页查询，这里初始设置页码为0
				size: 10, // 每页显示的条数
				total: 0, // 数据总条数
				search: {}, // 搜索对象
				tempSearch: {} // 提供给混合初始化搜索对象
			},
			/**
			 * uview2.0
			 * u-loadmore 组件配置（list-minxin）
			 */
			uLoadMore: {
				/**
				 * 状态  'loadmore','loading','nomore'
				 */
				status: 'loadmore',
				loadmoreText: loadMoreConf.loadMoreText,
				loadingText: loadMoreConf.loadingText,
				nomoreText: loadMoreConf.noMoreText
			},
			/**
			 * uni-load-more 组件配置（list-minxin）
			 */
			uniLoadMore: {
				/**
				 * 状态  'more','loading','noMore'
				 */
				status: 'more',
				loadText: {
					loadmore: loadMoreConf.loadMoreText,
					loading: loadMoreConf.loadingText,
					nomore: loadMoreConf.noMoreText
				}
			}
		};
	},
	computed: {
		/**
		 * uview2.0
		 * loadMore组件status计算属性（list-minxin）
		 */
		uLoadMoreStatus() {
			if (this.mxListConf.loading) {
				return 'loading'
			}
			if (this.mxListConf.finished) {
				return 'nomore'
			} else {
				return 'loadmore'
			}
		},
		/**
		 * uni-load-more
		 * loadMore组件status计算属性（list-minxin）
		 */
		uniLoadMoreStatus() {
			if (this.mxListConf.loading) {
				return 'loading'
			}
			if (this.mxListConf.finished) {
				return 'noMore'
			} else {
				return 'more'
			}
		}
	},
	async onLoad() {
		if (this.mxListConf.mode == 'load') {
			await this.mxListInitData()
		}

	},
	async onShow() {
		if (this.mxListConf.mode == 'show') {
			await this.mxListInitData()
		}
	},
	/**
	 * 下拉刷新
	 * @warn 需要在 pages.json 里，找到的当前页面的pages节点，并在 style 选项中开启 enablePullDownRefresh。
	 */
	async onPullDownRefresh() {
		console.log('下拉刷新');
		this.mxListInitPageData();
		this.mxListResetSearch();
		await this.mxListGetListFactory();
		uni.stopPullDownRefresh();
	},
	/**
	 * 上拉加载
	 */
	async onReachBottom() {
		console.log('上拉加载');
		// 加载中或完成重复触发直接终止
		if (this.mxListConf.loading || this.mxListConf.finished) return;
		this.mxListGetListFactory();
	},
	/**
	 * 所有混合的方法均已'mxListXXXX'开头
	 */
	methods: {
		/**
		 * 初始化数据
		 */
		async mxListInitData() {
			// 拷贝搜索初始化对象属性和数据
			this.mxListConf.tempSearch = _deepClone(this.mxListConf.search);
			console.log(this.mxListConf.tempSearch);
			// 查询列表
			await this.mxListGetListFactory();
		},
		/**
		 * 搜索函数
		 */
		async mxListSearchData() {
			this.mxListInitPageData();
			await this.mxListGetListFactory();
		},
		/**
		 * 重置搜索
		 */
		mxListResetSearch() {
			this.mxListConf.search = _deepClone(this.mxListConf.tempSearch)
			// console.log('重置搜索完成', this.search)
		},
		/**
		 * 初始化页面的数据
		 * @param {Object} size
		 */
		mxListInitPageData(size) {
			this.mxListConf.finished = false;
			this.mxListConf.page = 0;
			this.mxListConf.list = [];
			this.mxListConf.size = size || 10;
			this.mxListConf.total = 0;
		},
		/**
		 * 请求工厂函数
		 */
		async mxListGetListFactory() {
			// 如果已经全部加载完成直接终止执行
			if (this.mxListConf.finished) return;
			this.mxListConf.loading = true;
			this.mxListConf.page++;
			await this.mxListGetList();
			this.mxListConf.loading = false;
			// 判断是否全部加载完成
			if (this.mxListConf.list.length == this.mxListConf.total) {
				this.mxListConf.finished = true;
			}
		},
		/**
		 * 数据请求方法需要在页面内重写
		 */
		async mxListGetList() {},
	}
}
// 深拷贝
const _deepClone = (source) => {
	let target;
	if (typeof source === 'object') {
		target = Array.isArray(source) ? [] : {}
		for (let key in source) {
			if (source.hasOwnProperty(key)) {
				if (typeof source[key] !== 'object') {
					target[key] = source[key]
				} else {
					target[key] = _deepClone(source[key])
				}
			}
		}
	} else {
		target = source
	}
	return target
};